home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 2
/
AACD 2.iso
/
AACD
/
Magazine
/
GraphicsCards
/
StormMesa
/
src
/
mmath_asmppc.p
< prev
next >
Wrap
Text File
|
1999-02-04
|
6KB
|
204 lines
XDEF _gl_sqrt
XDEF _gl_sqrt__r
_gl_sqrt__r
_gl_sqrt
ls f0,_f_0
ls f5,_f_0_5
fcmpu f0,f1
beq .store
frsqrte f7,f1 ;calculate SQRT
fres f0,f7
fmadds f0,f1,f7,f0
fmuls f0,f0,f5
fdivs f7,f1,f0
fadds f0,f7,f0
fmuls f0,f0,f5
fdivs f7,f1,f0
fadds f0,f7,f0
fmuls f0,f0,f5
.store
fmr f1,f0
blr
/* this function here is inaccurate, but extremly fast
very useful for vector normalization, if low accuracy
is acceptable */
XDEF _gl_invsqrt
XDEF _gl_invsqrt__r
_gl_invsqrt__r
frsqrte f1,f1
blr
XDEF _fast_exp
XDEF _fast_exp__r
_fast_exp
_fast_exp__r
ls f2,invln2
ls f3,ln2
ls f4,p1
ls f5,p2
lf f6,_CITF_0
fmuls f7,f2,f1 ;f7 = x / ln2
fctiwz f0,f7
stfd f0,-8(r1)
lwz r3,-4(r1)
xoris r4,r3,$8000
sw r4,_CITF_TEMP+4
lf f7,_CITF_TEMP
fsub f7,f7,f6 ;f7 = k = (int)x / ln2
fnmsubs f8,f7,f3,f1 ;f8 = r
fmuls f9,f8,f8 ;f9 = r^2
fmadds f10,f5,f9,f4
fnmsubs f10,f10,f9,f8 ;f10 = R1
ls f11,_f_2 ;f11 = 2.0
fsubs f12,f11,f10 ;f12 = 2-R1
fmuls f10,f8,f10 ;f10 = r*R1
fdivs f10,f10,f12 ;f10 = r*R1/(2-R1)
fadds f10,f10,f8 ;f10 = r+r*R1/(2-R1)
ls f11,_f_1 ;f11 = 1.0
fadds f10,f10,f11 ;f10 = exp(r)
IFNE 1
slwi r4,r3,20
addis r4,r4,$3ff0
stw r4,-8(r1)
li r0,0
stw r0,-4(r1)
lfd f7,-8(r1)
ELSE
slwi r4,r3,23
addis r4,r4,$3f80
stw r4,-4(r1)
lfs f7,-4(r1)
ENDC
fmul f1,f7,f10 ;f1 = exp(x)
blr
XDEF _fast_log
XDEF _fast_log__r
_fast_log
_fast_log__r
ls f8,ln2
ls f9,l1
ls f10,l2
stfs f1,-4(r1)
lwz r3,-4(r1)
srwi r4,r3,23
andi. r4,r4,$ff
subi r4,r4,$7f ;r4 = k
oris r3,r3,$ff80
xoris r3,r3,$ff80
oris r3,r3,$3f80
stw r3,-4(r1)
lfs f2,-4(r1) ;f2 = 1+f
ls f3,_f_1 ;f3 = 1.0
fadds f4,f2,f3 ;f4 = 2+f
fsubs f5,f2,f3 ;f5 = f
fdivs f6,f5,f4 ;f6 = s = f/(2+f)
fmuls f7,f6,f6 ;f7 = s*s
fmadds f11,f10,f7,f9
fmuls f12,f11,f7
fmuls f11,f12,f6
fadds f12,f11,f6
fadds f11,f12,f6 ;f11 = log(1+f)
lf f2,_CITF_0
xoris r5,r4,$8000
sw r5,_CITF_TEMP+4
lf f3,_CITF_TEMP
fsub f3,f3,f2 ;f3 = (float)k
fmuls f3,f3,f8 ;f3 = k*ln2
fadds f1,f11,f3 ;f1 = log(x)
blr
XDEF _fast_pow
XDEF _fast_pow__r
_fast_pow
_fast_pow__r
mflr r0
stw r0,8(r1)
stwu r1,-64(r1)
stfs f2,60(r1)
bl _fast_log
lfs f2,60(r1)
fmuls f1,f1,f2
bl _fast_exp
addi r1,r1,64
lwz r0,8(r1)
mtlr r0
blr
XDEF _fast_invsqrt
XDEF _fast_invsqrt__r
_fast_invsqrt
_fast_invsqrt__r
ls f5,_f_0_5
fsubs f0,f5,f5
fcmpu f0,f1
fadd f3,f5,f5
fadd f3,f3,f5
beq .end
frsqrte f0,f1
fmuls f6,f1,f5
fmuls f4,f0,f0
fnmsubs f2,f4,f6,f3
fmuls f0,f2,f0
fmuls f4,f0,f0
fnmsubs f2,f4,f6,f3
fmuls f0,f2,f0
fmuls f4,f0,f0
fnmsubs f2,f4,f6,f3
fmuls f1,f2,f0
.end
blr
XDEF _fast_sqrt
XDEF _fast_sqrt__r
_fast_sqrt
_fast_sqrt__r
ls f5,_f_0_5
fsubs f0,f5,f5
fcmpu f0,f1
fadd f3,f5,f5
fadd f3,f3,f5
beq .end
frsqrte f0,f1
fmuls f6,f1,f5
fmuls f4,f0,f0
fnmsubs f2,f4,f6,f3
fmuls f0,f2,f0
fmuls f4,f0,f0
fnmsubs f2,f4,f6,f3
fmuls f0,f2,f0
fmuls f4,f0,f0
fnmsubs f2,f4,f6,f3
fmuls f1,f2,f0
fres f1,f1
.end
blr
section data
_f_0 dc.s 0
_f_0_5 dc.s 0.5
_f_10_e_60 dc.l $4c98e45c,$b7e8c8e4
_f_10_e_m60 dc.l $33b011c3,$d1cf8112
ln2 dc.s 0.69314718
invln2 dc.s 1.442695042
p1 dc.s 0.1666666667
p2 dc.s -0.002777777778
l1 dc.s 0.6666666666
l2 dc.s 0.4000000000
_CITF_0 dc.l $43300000,$80000000
_CITF_TEMP dc.l $43300000,0
_f_1 dc.s 1.0
_f_2 dc.s 2.0